package com.chen.librarysystem.service.impl;

import com.chen.librarysystem.entry.User;
import com.chen.librarysystem.enumenrty.LogState;
import com.chen.librarysystem.log.LibraryLog;
import com.chen.librarysystem.mapper.FileMapper;
import com.chen.librarysystem.mapper.impl.FileMapperImpl;
import com.chen.librarysystem.service.UserService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;

public class UserServiceImpl implements UserService {
    private final Map<String, User> users;
    private final FileMapper fileMapper = new FileMapperImpl();

    public UserServiceImpl() {
        users = fileMapper.loadUserData();
    }

    /**
     * 检查用户是否已注册
     *
     * @param username 用户名
     * @param password 密码
     * @return 如果用户已注册返回true，否则返回false
     */
    @Override
    public boolean isRegistered(String username, String password) {
        if (users == null || users.isEmpty()) {
            return false;
        }
        // 获取用户数据
        if (users.containsKey(username)) {
            // 验证密码
            return users.get(username).getPassword().equals(password);
        }
        return false;
    }

    /**
     * 注册新用户
     *
     * @param user 用户对象
     */
    @Override
    public void register(User user) {
        users.put(user.getName(), user);
        if (fileMapper.saveUserData(users)) {
            LibraryLog.log(Level.INFO, "用户注册成功！");
        } else {
            LibraryLog.log(Level.WARNING, "用户注册失败！");
        }
    }

    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 包含登录状态和用户对象的Map
     */
    @Override
    public Map<LogState, User> login(String username, String password) {
        Map<LogState, User> result = new HashMap<>();
        User user = users.get(username);
        if (user == null) {
            LibraryLog.log(Level.SEVERE, "用户不存在！");
            result.put(LogState.ERROR, null);
            return result;
        }
        if (!user.getPassword().equals(password)) {
            LibraryLog.log(Level.WARNING, "密码错误！");
            result.put(LogState.FAILURE, null);
            return result;
        }

        result.put(LogState.SUCCESS, user);
        LibraryLog.log(Level.INFO, "用户登录成功！");
        return result;
    }

    /**
     * 修改用户密码
     *
     * @param username    用户名
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 如果密码修改成功返回true，否则返回false
     */
    @Override
    public boolean changePassword(String username, String oldPassword, String newPassword) {
        if (username == null || oldPassword == null || newPassword == null) return false;
        if (username.isEmpty() || oldPassword.isEmpty() || newPassword.isEmpty()) return false;
        if (users.containsKey(username)) {
            User user = users.get(username);
            if (user.getPassword().equals(oldPassword)) {
                user.setPassword(newPassword);
                users.put(username, user);
                fileMapper.saveUserData(users);
                LibraryLog.log(Level.INFO, "用户修改密码成功！");
                return true;
            }
            LibraryLog.log(Level.WARNING, "用户密码错误，密码修改失败！");
            return false;
        }
        LibraryLog.log(Level.WARNING, "用户不存在，密码修改失败！");
        return false;
    }

    /**
     * 更新用户信息
     *
     * @param username 用户名
     * @param user     新的用户对象
     * @return 如果更新成功返回true，否则返回false
     */
    @Override
    public boolean updateUser(String username, User user) {
        if (username == null || user == null || username.isEmpty()) return false;
        if (users.containsKey(username)) {
            users.put(username, user);
            return fileMapper.saveUserData(users);
        }
        return false;
    }

    /**
     * 删除用户
     *
     * @param username 用户名
     * @return 如果删除成功返回true，否则返回false
     */
    @Override
    public boolean deleteUser(String username) {
        if (username == null || username.isEmpty()) return false;
        if (users.remove(username) == null) return false;
        LibraryLog.log(Level.INFO, "用户:" + username + "删除成功！");
        return fileMapper.saveUserData(users);
    }

    /**
     * 获取所有用户列表
     *
     * @return 用户列表
     */
    @Override
    public List<User> getAllUsers() {
        return users.values().stream().toList();
    }

    /**
     * 根据用户名获取用户对象
     *
     * @param username 用户名
     * @return 用户对象，如果不存在返回null
     */
    @Override
    public User getUserByName(String username) {
        return users.get(username);
    }

}
